Úvod


KAPITOLA 6

PRÁCE S DATY 2

V minulé kapitole jsme se seznámili s tidyverse, který kromě balíčku ggplot2 obsahuje i několik dalších balíčků velice užitečných pro práci v R. Jedním z nich je i dplyr, jenž nám zjednoduší naši dosavadní práci zejména s data frame.

dplyr nám pomůže data třídit, přeskupovat, všemožně modifikovat či nad nimi provádět různé početní a statistické operace. Pojďme si proto tyto příkazy postupně představit. Před tím si však nezapomeňte načíst do RStudia samotný balíček tidyverse (popřípadě pouze dplyr).

Filter

Column

Perth: Filter

Naše australské tažení dplyrem začíná v Perthu, v jehož okolí nenalezneme nic jiného než poušť. Navzdory tomu ale v této kapitole nalezneme velice úrodné prostředí, ze kterého vzejde velké množství vysoce užitečných příkazů pro práci s daty. Pojďme se s nimi seznámit.

Příkaz filter() nám pomůže, jak již samotný název napovídá, při filtraci dat s cílem vytvoření nové databáze. Představte si například, že pracujeme s našimi oblíbenými Osadníky a chceme z nich vytvořit zcela nový data frame, který bude obsahovat pouze hráče do 25 let včetně, kteří nejsou registrováni v žádném klubu deskových her, a to ani v Austrálii. Jak to provést? Buďto lze oprášit naše staré znalosti z předchozích kapitol (rozpomeňme se na hranaté závorky), či se naučit pracovat s velice jednoduchým a intuitivním příkazem filter().

Jeho struktura je taková, že za pojmenováním příkazu v závorce následuje název databáze, z níž budeme data vybírat. Poté do závorky uvedeme jednotlivé podmínky, jež jsou vždy odděleny čárkou. Pro větší přehlednost je lépe tyto podmínky uvádět na samostatném řádku, jak to lze vidět u následujícího skriptu. Výslednou databázi můžeme vypsat přímo do konzole či ji vložit do nově vzniklé proměnné, v našem případě Katan2.

Katan2 <- 
  filter(Katan, 
  Věk <= 25,
  Klub != "ano" ) 
# Jelikož máme v proměnné Klub pouze dvě varianty hodnot, 
# lze napsat přímo Klub == "ne".
# A tibble: 111 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 101 more rows

Ačkoliv je výše uvedený příkaz velice intuitivní, mohla by nám uniknout jedna drobná maličkost. U názvů proměnných v rámci příkazů dplyr neuvádíme název databáze spojený s dolarem (tj. Katan$Věk, respektive Katan$Klub), obdobně jako v rámci příkazů ggplot2. Tato připomínka se týká všech příkazů dplyr, které si v této kapitole ukážeme.

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?

Katan[Katan$Věk <= 25 & Katan$Klub != "ano", ]

Ačkoliv je tento typ příkazu oproti dplyru hůře čitelný, zvláště tehdy, budeme-li naše podmínky zesložiťovat, bylo by velice dobré, abychom ani na tento styl zápisu nezapomněli a nepřestali mu rozumět. Může se nám to hodit zejména tehdy, budeme-li pracovat se skripty cizích analytiků.

V příkazu filter() lze využít i další logické operátory jako je nebo (svislá čára |) či a zároveň (ampersand &). Ukažme si je na příkladu, ve kterém budeme chtít vybrat pouze ženy od 26 do 30 let včetně, které mají bakalářské nebo magisterské vzdělání.

Katan2 <- 
  filter(Katan, 
  Pohlaví == "žena", 
  Věk >= 26 & Věk <= 30,
  Vzdělání == "Bc - VŠ" | Vzdělání == "VŠ")
# A tibble: 6 x 9
  Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti
   <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl>
1      3    26 žena    VŠ       ne    pracuje nekouří nečlen     0
2      3    26 žena    Bc - VŠ  ne    pracuje nekouří člen       0
3      3    26 žena    VŠ       ne    pracuje nekouří člen       0
4      3    26 žena    Bc - VŠ  ne    pracuje kouří   nečlen     0
5      2    27 žena    VŠ       ne    pracuje kouří   nečlen     0
6      1    28 žena    VŠ       ne    pracuje nekouří nečlen     0

Naše proměnná Vzdělání obsahuje pouze čtyři varianty hodnot. Představme si ale, že disponuje kupříkladu dvaceti různými variantami výstupu a my chceme vybrat třeba jen dvanáct z nich. V takovém případě by nebylo příliš praktické a vhodné použít příkaz ve formátu Proměnná == "hodnota" | Proměnná == "hodnota" atd., který by byl velice dlouhý a nepřehledný. Pro tento případ tu totiž máme operátor %in%. Ukažme si ho na stejném příkladu s proměnnou Vzdělání, pomocí něhož vypíšeme do konzole všechna pozorování pro bakaláře a magistry.

filter(Katan, 
  Vzdělání %in% c("Bc - VŠ", "VŠ"))
# A tibble: 69 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      6    22 muž     Bc - VŠ  ne    nepracuje nekouří člen       0
 2      2    23 muž     Bc - VŠ  ne    nepracuje nekouří člen       0
 3      3    23 muž     Bc - VŠ  ne    nepracuje nekouří člen       0
 4      4    23 žena    Bc - VŠ  ano   nepracuje kouří   nečlen     0
 5      5    23 muž     Bc - VŠ  ano   nepracuje kouří   nečlen     0
 6      2    24 žena    Bc - VŠ  ne    nepracuje nekouří člen       0
 7      4    24 žena    Bc - VŠ  ne    pracuje   nekouří člen       0
 8      3    24 muž     Bc - VŠ  ano   nepracuje nekouří nečlen     0
 9      1    24 žena    Bc - VŠ  ne    pracuje   nekouří nečlen     0
10      3    24 muž     Bc - VŠ  ne    nepracuje kouří   člen       0
# ... with 59 more rows

Nejen pro faktorové, ale i pro numerické proměnné lze nabídnout jedno zjednodušení. V tomto případě nese název between(). Abychom nemuseli psát příkaz ve tvaru Věk >= 26 & Věk <= 30, můžeme do skriptu uvést pouze následující pokyn, díky němuž vypíšeme do konzole všechna pozorování pro jednice od 26 do 30 let včetně.

filter(Katan, 
  between(Věk, 26, 30))
# A tibble: 28 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl>
 1      3    26 žena    VŠ       ne    pracuje nekouří nečlen     0
 2      3    26 žena    SŠ       ne    pracuje nekouří člen       0
 3      3    26 žena    Bc - VŠ  ne    pracuje nekouří člen       0
 4      2    26 muž     VŠ       ne    pracuje nekouří člen       0
 5      3    26 žena    VŠ       ne    pracuje nekouří člen       0
 6      2    26 muž     VŠ       ne    pracuje kouří   člen       0
 7      3    26 žena    Bc - VŠ  ne    pracuje kouří   nečlen     0
 8      3    27 muž     VŠ       ne    pracuje nekouří nečlen     1
 9      1    27 muž     VŠ       ne    pracuje nekouří člen       1
10      2    27 muž     VŠ       ne    pracuje nekouří nečlen     1
# ... with 18 more rows

V závěru představení příkazu filter() se ještě podívejme na jeden příklad. Ten se nám bude hodit zejména tehdy, bude-li databáze obsahovat chybějící proměnné. Osadníkům však žádné hodnoty nechybí, proto si tu nějaké vytvoříme. Nejjednodušší bude využít příkaz edit(), který nám umožní editovat data podobně jako v tabulkovém kalkulátoru (tento příkaz jsme si představili již v Panamě).

Katan2 <- edit(Katan)

Poté, co jsme například v proměnné Věk vytvořili několik chybějících hodnot (zkráceně NA - Not Available), budeme chtít zjistit jejich počet. K tomu se nám bude nejlépe hodit příkaz is.na(), který by nám též neměl být neznámý.

filter(Katan, 
  is.na(Věk))
# A tibble: 3 x 9
  Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
   <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
1      4    NA žena    ZŠ       ne    nepracuje nekouří nečlen     0
2      4    NA žena    ZŠ       ne    nepracuje nekouří nečlen     0
3      3    NA muž     ZŠ       ne    nepracuje nekouří člen       0

Pokud bychom však do konzole chtěli vypsat pozorování bez chybějících hodnot, použili bychom vykřičník. Takový příkaz můžeme vidět níže. V něm nám skript vytvoří datovou tabulku Katan2, která bude obsahovat pouze ženy s jedním až třemi dětmi, u nichž nechybí informace o věku.

Katan2 <- filter(Katan, 
  !is.na(Věk),
  Pohlaví == "žena", 
  between(Děti, 1,3))
# A tibble: 2 x 9
  Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
   <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
1      1    23 žena    SŠ       ano   nepracuje nekouří nečlen     1
2      2    37 žena    VŠ       ne    pracuje   kouří   nečlen     2

Column

Příklady

Příklad 1

Vytvořte databázi Katan2, která bude obsahovat pouze muže starší 26 let, kteří nemají vysokoškolské vzdělání.

Příklad 2

Vytvořte databázi Katan2, která bude obsahovat pouze ženy mladší 26 let, které mají vysokoškolské vzdělání a zároveň mají děti.

Slice

Column

Alice Springs: Slice

Další příkaz, který si probereme téměř uprostřed australského kontinentu, nese název slice(). Ten použijeme tehdy, chceme-li vytvořit novou databázi s vybranými řádky nikoliv podle určitého filtru proměnných, ale podle jejich pořadí v data frame (např. pokud je naším cílem vybrat 1. až 50. řádek databáze).

Struktura příkazu je zpočátku obdobná jako u příkazu filter(). Opět začínáme klíčovým slovesem (v tomto případě slice), za kterým bude v závorce uveden název databáze, již budeme pomyslně krájet. Následně uvedeme čísla řádků, které chceme přiřadit do nově vytvořené databáze.

Katan2 <- 
  slice(Katan, 1:50)
# A tibble: 50 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 40 more rows

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?

Katan2 <- Katan[1:50, ]

Obdobně jako minule, i zde využijeme nesmírnou variabilitu hranatých závorek.

Chceme-li však vybrat několik nenavazujících úseků pozorování, například řádky 1 až 50 a řádky 151 až 200, není tu nic jednoduššího než využít služeb starého dobrého příkazu c().

Katan2 <- 
  slice(Katan, c(1:50, 151:200))
# A tibble: 100 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 90 more rows

Příkaz slice() není příliš komplikovaný. Přesuňme se proto k příkazu select(), jehož popis bude lehce obsáhlejší.

Column

Příklady

Příklad 3

Vytvořte databázi, která bude obsahovat pouze prvních a posledních šest pozorování z databáze Katan.

Select

Column

Adelaide: Select

Příkaz select() nám na rozdíl od funkce filter() pomůže při výběru a přeskupení celých sloupců. Představme si třeba, že chceme vytvořit novou databázi, která bude obsahovat pouze proměnné Věk a Partie. K tomu nám bude stačit do R zapsat následující příkaz.

Katan2 <-
    select(Katan, 
           Věk, Partie)
# A tibble: 200 x 2
     Věk Partie
   <dbl>  <dbl>
 1    13      4
 2    13      4
 3    14      3
 4    14      8
 5    15      5
 6    15      6
 7    15      6
 8    15      3
 9    15      3
10    15      9
# ... with 190 more rows

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?

Katan2 <- Katan[, c("Věk", "Partie")]

Hranaté závorky i v tomto případě zůstávají na scéně, pouze se v jejich útrobách přesouváme na pravou stranu od čárky, a to z logiky filozofie fungování těchto závorek (levá strana vybírá řádky, pravá strana definuje sloupce).

Možná se v tuto chvíli zamýšlíte nad tím, proč se vlastně učit všechny ty příkazy filter(), slice() a select(), když tu veškerou práci za ně zvládnou hranaté závorky, a to bez potřeby načítat nějaký balíček? Důvod tu existuje, i když jej prozatím ještě nevidíte. Málo kdy totiž budeme příkazy jako filter(), slice() či select() používat samostatně, jelikož je budeme chtít různě kombinovat v mnohem složitější podobě, než prozatím dovedeme. V takové případě (a stane se tomu v následující kapitole) se nám příkazy z balíčku dplyr budou velice hodit. Uvidíte sami. Proto žádné výmluvy a zpět do práce.

Máme-li v naší databázi více proměnných, které obsahují určité slovo, ale i písmeno nebo číslo, které chceme v nové databázi zachovat, využijeme příkazu contains().

Katan2 <-
    select(Katan, 
           contains("e"))
# Databáze Katan2 bude obsahovat veškeré proměnné z databáze Katan, 
# které mají ve svém názvu obsaženo písmeno „e“ bez ohledu na velká 
# a malá písmena.
# A tibble: 200 x 4
   Partie Kolej Práce     Kouření
    <dbl> <chr> <chr>     <chr>  
 1      4 ne    nepracuje nekouří
 2      4 ne    nepracuje nekouří
 3      3 ne    nepracuje nekouří
 4      8 ne    nepracuje nekouří
 5      5 ne    nepracuje nekouří
 6      6 ne    nepracuje nekouří
 7      6 ne    nepracuje nekouří
 8      3 ne    nepracuje nekouří
 9      3 ne    nepracuje nekouří
10      9 ne    nepracuje nekouří
# ... with 190 more rows

Příkaz select() lze využít i v případě, chceme-li pouze změnit pořadí jednotlivých proměnných v databázi.

Katan2 <-
    select(Katan, 
           Věk, Partie, Kolej, Kouření, Klub, Práce, Vzdělání, Děti)
# Příkaz vytvoří proměnnou Katan2, která bude obsahovat vybrané 
# proměnné z databáze Katan ve výše uvedeném pořadí.
# A tibble: 200 x 8
     Věk Partie Kolej Kouření Klub   Práce     Vzdělání  Děti
   <dbl>  <dbl> <chr> <chr>   <chr>  <chr>     <chr>    <dbl>
 1    13      4 ne    nekouří nečlen nepracuje ZŠ           0
 2    13      4 ne    nekouří nečlen nepracuje ZŠ           0
 3    14      3 ne    nekouří člen   nepracuje ZŠ           0
 4    14      8 ne    nekouří nečlen nepracuje ZŠ           0
 5    15      5 ne    nekouří člen   nepracuje ZŠ           0
 6    15      6 ne    nekouří člen   nepracuje ZŠ           0
 7    15      6 ne    nekouří člen   nepracuje ZŠ           0
 8    15      3 ne    nekouří člen   nepracuje ZŠ           0
 9    15      3 ne    nekouří člen   nepracuje ZŠ           0
10    15      9 ne    nekouří nečlen nepracuje ZŠ           0
# ... with 190 more rows

Máme-li však za cíl pouze přesunout určitou proměnnou na první pozici, není nutné ručně vypisovat názvy ostatních sloupců, jelikož si můžeme vypomoci příkazem everything().

Katan2 <-
    select(Katan, 
           Věk, everything())
# Příkaz vytvoří databázi Katan2, kde na prvním místě bude zobrazena 
# proměnná Věk a poté všechny ostatní podle jejich pořadí z původní 
# databáze Katan.
# A tibble: 200 x 9
     Věk Partie Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
   <dbl>  <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1    13      4 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2    13      4 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3    14      3 muž     ZŠ       ne    nepracuje nekouří člen       0
 4    14      8 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5    15      5 muž     ZŠ       ne    nepracuje nekouří člen       0
 6    15      6 muž     ZŠ       ne    nepracuje nekouří člen       0
 7    15      6 muž     ZŠ       ne    nepracuje nekouří člen       0
 8    15      3 žena    ZŠ       ne    nepracuje nekouří člen       0
 9    15      3 žena    ZŠ       ne    nepracuje nekouří člen       0
10    15      9 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 190 more rows

S příkazem select() lze proměnné nejenom přeskupovat, ale i mazat. Pokud jich k odstranění máme víc, není to též žádná komplikace, jelikož lze použít nám dobře známý operátor dvojtečka.

Katan2 <-
    select(Katan, 
           -Vzdělání, -(Práce:Pohlaví))
# Příkaz odstraní proměnnou Vzdělání a dále všechny proměnné mezi sloupci 
# Práce a Pohlaví (včetně těchto dvou) z databáze Katan. 

# lze zapsat i pomocí příkazu c(): select(Katan, -c(Vzdělání, Práce:Pohlaví))
# A tibble: 200 x 5
   Partie   Věk Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>  <dbl>
 1      4    13 nekouří nečlen     0
 2      4    13 nekouří nečlen     0
 3      3    14 nekouří člen       0
 4      8    14 nekouří nečlen     0
 5      5    15 nekouří člen       0
 6      6    15 nekouří člen       0
 7      6    15 nekouří člen       0
 8      3    15 nekouří člen       0
 9      3    15 nekouří člen       0
10      9    15 nekouří nečlen     0
# ... with 190 more rows

Nechce se vám stále vypisovat jednotlivé názvy proměnných? Zkuste použít jejich číselné pořadí z původní databáze.

Katan2 <-
    select(Katan, 
           -3, -(5:9))
# Příkaz odstraní proměnnou Vzdělání a dále všechny proměnné mezi sloupci 
# Práce a Pohlaví (včetně těchto dvou) z databáze Katan. 

# lze zapsat i pomocí příkazu c(): select(Katan, -c(3, 5:9))
# A tibble: 200 x 3
   Partie   Věk Vzdělání
    <dbl> <dbl> <chr>   
 1      4    13 ZŠ      
 2      4    13 ZŠ      
 3      3    14 ZŠ      
 4      8    14 ZŠ      
 5      5    15 ZŠ      
 6      6    15 ZŠ      
 7      6    15 ZŠ      
 8      3    15 ZŠ      
 9      3    15 ZŠ      
10      9    15 ZŠ      
# ... with 190 more rows

Column

Příklady

Příklad 4

Vytvořte databázi, která bude na prvních dvou místech obsahovat proměnné Věk a Práce a na dalších pozicích veškeré ostatní proměnné z databáze Katan v jejich původním pořadí.

Příklad 5

Vytvořte databázi, která bude obsahovat pouze poslední čtyři proměnné z databáze Katan.

Příklad 6

Vytvořte databázi, která na prvním místě bude obsahovat proměnnou Pohlaví a dále pak všechny ostatní proměnné databáze Katan kromě proměnných Partie a Klub.

Rename

Column

Melbourne: Rename

Ze druhé kapitoly si možná pamatujete na jeden dosti krkolomný příkaz, pomocí něhož jsme se naučili přejmenovat proměnnou v rámci data frame. Není divu, proč byl krkolomný. Učili jsme se o něm v chudé americké Panamě, zatímco nyní se nacházíme v Melbourne, které bylo časopisem The Economist považováno za nejlepší místo k životu mezi léty 2010 - 2017. Pro milovníky dopravy též zmíním i fakt, že v Melbourne nalezneme nejdelší tramvajovou síť na světě.

names(Katan)[names(Katan) == "Věk"] <- "Age"
# A tibble: 200 x 9
   Partie   Age Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 190 more rows

Jak je vidět, panamský příkaz není z nejjednodušších a lépe se bude určitě pamatovat ten následující z balíčku dplyr, pomocí kterého přejmenujeme proměnné Vzdělání a Partie na Education a Games.

Katan2 <-
    rename(Katan, "Education" = Vzdělání, 
                  "Games" = Partie)
# Všimněte si, že nejdříve píšeme nový název proměnné a teprve až za 
# rovnítko zapíšeme původní název proměnné, v našem případě Vzdělání a Partie.
# A tibble: 200 x 9
   Games   Věk Pohlaví Education Kolej Práce     Kouření Klub    Děti
   <dbl> <dbl> <chr>   <chr>     <chr> <chr>     <chr>   <chr>  <dbl>
 1     4    13 žena    ZŠ        ne    nepracuje nekouří nečlen     0
 2     4    13 žena    ZŠ        ne    nepracuje nekouří nečlen     0
 3     3    14 muž     ZŠ        ne    nepracuje nekouří člen       0
 4     8    14 muž     ZŠ        ne    nepracuje nekouří nečlen     0
 5     5    15 muž     ZŠ        ne    nepracuje nekouří člen       0
 6     6    15 muž     ZŠ        ne    nepracuje nekouří člen       0
 7     6    15 muž     ZŠ        ne    nepracuje nekouří člen       0
 8     3    15 žena    ZŠ        ne    nepracuje nekouří člen       0
 9     3    15 žena    ZŠ        ne    nepracuje nekouří člen       0
10     9    15 žena    ZŠ        ne    nepracuje nekouří nečlen     0
# ... with 190 more rows

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli přejmenovat všechny proměnné?

names(Katan) <- 
c("Games", "Age", "Gender", "Education", "Dormitory", 
  "Job", "Children", "Smoke", "Club") 
# A tibble: 200 x 9
   Games   Age Gender Education Dormitory Job       Children Smoke   Club
   <dbl> <dbl> <chr>  <chr>     <chr>     <chr>     <chr>    <chr>  <dbl>
 1     4    13 žena   ZŠ        ne        nepracuje nekouří  nečlen     0
 2     4    13 žena   ZŠ        ne        nepracuje nekouří  nečlen     0
 3     3    14 muž    ZŠ        ne        nepracuje nekouří  člen       0
 4     8    14 muž    ZŠ        ne        nepracuje nekouří  nečlen     0
 5     5    15 muž    ZŠ        ne        nepracuje nekouří  člen       0
 6     6    15 muž    ZŠ        ne        nepracuje nekouří  člen       0
 7     6    15 muž    ZŠ        ne        nepracuje nekouří  člen       0
 8     3    15 žena   ZŠ        ne        nepracuje nekouří  člen       0
 9     3    15 žena   ZŠ        ne        nepracuje nekouří  člen       0
10     9    15 žena   ZŠ        ne        nepracuje nekouří  nečlen     0
# ... with 190 more rows

Chceme-li však přejmenovat pouze jednu proměnnou a nechceme přitom využít ani dplyr a ani příkaz, který byl uveden na úvod, můžeme použít následující pokyn.

colnames(Katan)[2] <- "Age"
# Číslo dvě v hranaté závorce symbolizuje pořadí proměnné, u které 
# název měníme.

Column

Příklady

Příklad 7

V databázi Katan změňte název proměnné Práce a Děti na Job a Children.

Příklad 8

V databázi Katan změňte názvy všech proměnných na názvy dle vašeho uvážení bez použití příkazu rename().

Add_rownames

Column

Sydney: Add_rownames

Představme si, že jsme v největším australském městě nalezli přebohatou žílu dat, která má však pojmenované řádky (ty třeba obsahují názvy států, jména, zkrátka cokoliv). My však z těchto pojmenování chceme vytvořit další proměnnou a místo těchto názvů zanechat obvyklé číselné označení řádků, jež je nejen pro práci s data frame mnohem praktičtější. Jak to provedeme? Použijeme příkaz add_rownames().

Abychom si však výše uvedený příkaz mohli názorně představit, musíme se nejdříve naučit pravý opak. Prvně si tedy vytvoříme vektor jmen hráčů pro naši databázi Katan, který následně použijeme pro pojmenování řádků v databázi. Teprve až poté si ukážeme, jak funguje samotný příkaz add_rownames(), který z našich jmen učiní další proměnnou databáze. Buďme nicméně alespoň trochu kreativní a vytvořme si vektor se skutečnými jmény. K tomu budeme potřebovat balíček pod názvem randomNames. Nainstalujme ho, spusťme a vytvořme vektor 200 jmen.

install.packages("randomNames")
library(randomNames)
Jména <- randomNames(200)

head(Jména)
[1] "Rainone, Nicholas" "Pearson, Nathan"   "al-Hallal, Randa" 
[4] "Liu, Mengyi"       "Abraha, Tre'Sean"  "el-Bahri, Sadoon" 

Chceme-li si s příkazem randomNames trochu pohrát, máme možnost vybrat si jména dokonce i podle pohlaví či etnicity (více naleznete zde).

Jména <- randomNames(200,
                ethnicity = 5,
                which.names = "both",
                name.order = "last.first",
                name.sep = ", ",
                sample.with.replacement = TRUE,
                return.complete.data = FALSE)

head(Jména)
[1] "Greenberg, Matthew" "Coleman, Michael"   "Nemitz, Angelica"  
[4] "Henson, Ashley"     "Cronin, Jordan"     "Ross, Kayla"       

Výsledný vektor Jména nyní můžeme pomocí následujícího příkazu spojit s databází Katan, u níž získáme pojmenované řádky.

Katan2 <- 
  data.frame(Katan, row.names = Jména)

head(Katan2)
                  Partie Věk Pohlaví Vzdělání Kolej     Práce Kouření   Klub
Knutsen, Benjamin      4  13    žena       ZŠ    ne nepracuje nekouří nečlen
Freeman, Allison       4  13    žena       ZŠ    ne nepracuje nekouří nečlen
Fielding, Juliun       3  14     muž       ZŠ    ne nepracuje nekouří   člen
Johnson, Sawyer        8  14     muž       ZŠ    ne nepracuje nekouří nečlen
Dawursk, Bryanna       5  15     muž       ZŠ    ne nepracuje nekouří   člen
Shleyfer, Steven       6  15     muž       ZŠ    ne nepracuje nekouří   člen
                  Děti
Knutsen, Benjamin    0
Freeman, Allison     0
Fielding, Juliun     0
Johnson, Sawyer      0
Dawursk, Bryanna     0
Shleyfer, Steven     0

V tuto chvíli jsme konečně připraveni použít příkaz add_rownames(), kvůli kterému jsme proměnnou Jména vytvářeli. Ten nám názvy řádků převede do nově vytvořené proměnné JménaHráčů, která se stane součástí databáze Katan3.

Katan3 <-
    add_rownames(Katan2, "JménaHráčů")
# A tibble: 200 x 10
   JménaHráčů     Partie   Věk Pohlaví Vzdělání Kolej Práce  Kouření Klub   Děti
   <chr>           <dbl> <dbl> <chr>   <chr>    <chr> <chr>  <chr>   <chr> <dbl>
 1 Myers, Derrick      4    13 žena    ZŠ       ne    nepra~ nekouří nečl~     0
 2 Stack, Gardner      4    13 žena    ZŠ       ne    nepra~ nekouří nečl~     0
 3 Whitman Smith~      3    14 muž     ZŠ       ne    nepra~ nekouří člen      0
 4 Williams, Che~      8    14 muž     ZŠ       ne    nepra~ nekouří nečl~     0
 5 Carpenter, Ty~      5    15 muž     ZŠ       ne    nepra~ nekouří člen      0
 6 Benavidez, Ka~      6    15 muž     ZŠ       ne    nepra~ nekouří člen      0
 7 Buscher, Lori~      6    15 muž     ZŠ       ne    nepra~ nekouří člen      0
 8 Mckenzie, Bre~      3    15 žena    ZŠ       ne    nepra~ nekouří člen      0
 9 Price, Jamilyn      3    15 žena    ZŠ       ne    nepra~ nekouří člen      0
10 Mcgaughey, So~      9    15 žena    ZŠ       ne    nepra~ nekouří nečl~     0
# ... with 190 more rows

A to bylo vše. S dplyrem ale ještě zdaleka nekončíme, neboť nás v této kapitole čeká ještě šest příkazů.

Column

Příklady

Příklad 9

Vytvořte proměnnou Kód, která bude obsahovat 200 unikátních kódů složených pouze z písmen. Kód by měl vždy obsahovat celkově pět náhodných písmen spojených dohromady (a to kvůli anonymizaci dat vzhledem k GDPR). Následně z těchto kódových označení vytvořte pojmenované řádky v rámci databáze Katan. Poté tyto kódy převeďte do nově vzniklé proměnné Kódová_označení, která se stane součástí databáze Katan tak, aby samotné řádky získaly zpět číselné označení.

Mutate a Transmute

Column

Auckland: Mutate a Transmute

Víte, co se v roce 1993 stalo v Aucklandu? Dva muži ve středním věku neměli co dělat, a proto začali věnovat svůj čas něčemu, co nemohli nazvat horším názvem než písmenem R. Zapamatujte si dobře jejich tváře. V případě jakýchkoli stížností na tento programovací jazyk se proto neobracejte na Rlandio, nýbrž přeneste svůj hněv na tyto dva pány, jejichž jména jsou Ross Ihaka a Robert Gentleman.

Pro tuto chvíli se však uklidněme a vraťme se zpět k dplyru. Chceme-li v rámci databáze vytvořit novou proměnnou (či aktualizovat nějakou původní), lze též využít balíčku dplyr, respektive příkazu mutate(). Řekněme třeba, že naše databáze Katan slaví své první narozeniny a my ji chceme aktualizovat tím, že věk hráčů zvýšíme též o jeden rok a přitom vytvoříme novou proměnnou VěkPlus. V takovém případě původní proměnná Věk zůstane zachována. Pokud bychom nicméně chtěli původní proměnnou Věk pouze přepsat novými hodnotami a žádnou novou proměnnou nevytvářet, stačilo by v následujícím skriptu pouze změnit název proměnné VěkPlus na Věk.

# chceme-li vytvořit novou proměnnou
Katan2 <-
    mutate(Katan, 
         VěkPlus = Věk + 1)
# V případě, že bychom měli v proměnné Věk chybějící hodnoty (NA),
# zůstane i nová hodnota v proměnné VěkPlus jako NA a 
# nikoliv jako 1, tj. NA + 1 != 1, ale stále NA.


# chceme-li přepsat stávající proměnnou
Katan2 <-
    mutate(Katan, 
         Věk = Věk + 1)
# A tibble: 200 x 10
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti VěkPlus
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>   <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0      14
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0      14
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0      15
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0      15
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0      16
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0      16
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0      16
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0      16
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0      16
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0      16
# ... with 190 more rows

Pokud nově vzniklou proměnnou či proměnné nechceme připojit ke stávající databázi (v našem případě Katan), ale chceme je uchovávat samostatně (jako vektor), využijeme místo mutate() příkaz transmute().

NováDatabáze <-
    transmute(Katan, 
            VěkPlus = Věk + 1)
# A tibble: 200 x 1
   VěkPlus
     <dbl>
 1      14
 2      14
 3      15
 4      15
 5      16
 6      16
 7      16
 8      16
 9      16
10      16
# ... with 190 more rows

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?

# chceme vytvořit novou proměnnou
Katan$VěkPlus <- Katan$Věk + 1

# chceme přepsat stávající proměnnou
Katan$Věk <- Katan$Věk + 1

Příkaz mutate() (respektive transmute()) může obsahovat i složitější funkce, jako například if_else(). Příkaz ifelse() už ale známe, nicméně bez podtržítka, tak jaký je mezi nimi vlastně rozdíl? Veskrze žádný. Jeden drobný tu však přeci jenom existuje. Funkce if_else() z balíčku dplyr pracuje mnohem rychleji než obyčejné iflese(), takže pokud pracujeme s doopravdy velkým množstvím dat (statisíce až miliony řádků), je tato funkce z výpočetního hlediska mnohem výhodnější.

Vyzkoušejme si příkaz if_else() a mutate() pomocí příkladu, u kterého budeme chtít vytvořit v rámci databáze Katan novou proměnnou s názvem VěkSkupiny. Ta by měla náš soubor dat rozdělit do následujících čtyř skupin (dospělá žena, dospělý muž, nezletilá slečna, nezletilý kluk).

Katan2 <-
  mutate(Katan, 
  VěkSkupiny = 
    if_else(
      Katan$Věk >= 18 & 
      Katan$Pohlaví == "žena","dospělá žena",
    if_else( 
      Katan$Věk>=18 & 
      Katan$Pohlaví == "muž", "dospělý muž",
    if_else(
      Katan$Věk<18 & 
      Katan$Pohlaví == "žena", "nezletilá slečna",
    if_else( 
      Katan$Věk<18 & 
      Katan$Pohlaví == "muž", "nezletilý kluk", "NA")))))
# A tibble: 200 x 10
   Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti VěkSkupiny  
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl> <chr>       
 1      4    13 žena    ZŠ       ne    neprac~ nekouří nečlen     0 nezletilá s~
 2      4    13 žena    ZŠ       ne    neprac~ nekouří nečlen     0 nezletilá s~
 3      3    14 muž     ZŠ       ne    neprac~ nekouří člen       0 nezletilý k~
 4      8    14 muž     ZŠ       ne    neprac~ nekouří nečlen     0 nezletilý k~
 5      5    15 muž     ZŠ       ne    neprac~ nekouří člen       0 nezletilý k~
 6      6    15 muž     ZŠ       ne    neprac~ nekouří člen       0 nezletilý k~
 7      6    15 muž     ZŠ       ne    neprac~ nekouří člen       0 nezletilý k~
 8      3    15 žena    ZŠ       ne    neprac~ nekouří člen       0 nezletilá s~
 9      3    15 žena    ZŠ       ne    neprac~ nekouří člen       0 nezletilá s~
10      9    15 žena    ZŠ       ne    neprac~ nekouří nečlen     0 nezletilá s~
# ... with 190 more rows

Příkaz if_else() je velice intuitivní. Přesto ale obdobně jako u ifelse() nezapomeňte u posledního řádku na NA, které tu je pro případ, že by zde ve skriptu nastala situace, při které by řádek databáze nevyhovoval ani jedné z podmínek. V takovém případě by byla hodnota proměnné pojmenována právě jako NA.

Column

Příklady

Příklad 10

Vytvořte v rámci databáze Katan novou proměnnou Gambler, která bude rozdělovat hráče do čtyř skupin podle proměnné Partie na příležitostný hráč (jedna až dvě partie za měsíc), častý hráč (tři až čtyři partie za měsíc), deskový gambler (pět až šest partií za měsíc) a král osadníků (více jak sedm partií za měsíc).

Distinct

Column

Suva: Distinct

Příkaz distinct() si klade za cíl zobrazovat unikátní hodnoty v proměnné. Pracujeme-li proto například s faktory, ukáže nám tato funkce jednotlivé názvy hodnot, kterých daná proměnná v databázi alespoň jednou nabývá. Příkaz distinct() nicméně lze použít i u numerických proměnných, zkrátka u všech.

Věk2 <- distinct(Katan, Věk)
# A tibble: 44 x 1
     Věk
   <dbl>
 1    13
 2    14
 3    15
 4    16
 5    17
 6    18
 7    19
 8    20
 9    21
10    22
# ... with 34 more rows

V rámci příkazu distinct() lze do příkazu zapsat i více proměnných. Pokud tak chceme zjistit počet unikátních kombinací počtu let a pohlaví, využijeme následující formy příkazu.

Věk2 <- distinct(Katan, Věk, Pohlaví)
# A tibble: 60 x 2
     Věk Pohlaví
   <dbl> <chr>  
 1    13 žena   
 2    14 muž    
 3    15 muž    
 4    15 žena   
 5    16 muž    
 6    16 žena   
 7    17 žena   
 8    17 muž    
 9    18 muž    
10    18 žena   
# ... with 50 more rows

Podíváme-li se na nově vzniklou proměnnou Věk2, zjistíme, že obsahuje 60 unikátních variant věku a pohlaví. Jak však zjistit konkrétní počty těchto jednotlivých kombinací? Není nic jednoduššího než použít příkaz table(). Ačkoliv je sice dplyr plný různých příkazů, není všemocný, proto tudíž nezapomínejme ani na ostatní příkazy mimo něj.

table(Katan$Věk, Katan$Pohlaví)
    
     muž žena
  13   0    2
  14   2    0
  15   4    3
  16   6    3
  17   4    2
  18   3    4
  19   3    6
  20   4    4
  21  12    4
  22   9    3
  23   6    2
  24   6    5
  25   4   10
  26   2    5
  27   5    1
  28   6    1
  29   5    0
  30   3    0
  31   9    0
  32   6    0
  33   3    0
  34   4    0
  35   5    0
  36   1    0
  37   3    1
  38   3    0
  39   1    0
  40   2    0
  41   3    0
  42   1    0
  43   1    1
  44   0    1
  46   1    0
  47   1    0
  48   1    0
  49   3    0
  50   3    0
  51   1    0
  62   1    0
  63   1    0
  68   1    0
  69   1    0
  74   1    0
  75   1    0

Column

Příklady

Příklad 11

Zjistěte, kolik unikátních kombinací počtu dětí a vzdělání obsahuje databáze Katan.

Arrange

Column

Honiara (Guadalcanal): Arrange

Předposlední příkaz nynější kapitoly si probereme v místech jedné z nejhorších bitev 2. sv. války v Pacifiku, tj. v místech bitvy o Guadalcanal. Navzdory hrozivému umístění této lekce se však žádných děsivých scén nebojte, neboť příkaz arrange() je velice mírumilovný, neškodný a též užitečný. S jeho pomocí totiž dokážeme seřadit data podle určité proměnné, v našem následujícím příkladu podle proměnné Věk, respektive Pohlaví.

Katan2 <-
    arrange(Katan, 
            Věk, Pohlaví)
# A tibble: 200 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      5    15 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
# ... with 190 more rows

Chceme-li data seřadit od nejvyšších hodnot po ty nejnižší, přidáme před název proměnné parametr desc (desc(Věk)).

Katan2 <-
    arrange(Katan, desc(Věk), Pohlaví)
# A tibble: 200 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl>
 1      1    75 muž     ZŠ       ne    pracuje kouří   nečlen     2
 2      2    74 muž     ZŠ       ne    pracuje kouří   nečlen     2
 3      1    69 muž     ZŠ       ne    pracuje kouří   nečlen     4
 4      2    68 muž     ZŠ       ne    pracuje kouří   nečlen     4
 5      1    63 muž     SŠ       ne    pracuje kouří   nečlen     2
 6      1    62 muž     ZŠ       ne    pracuje kouří   nečlen     2
 7      1    51 muž     SŠ       ne    pracuje nekouří nečlen     2
 8      1    50 muž     SŠ       ne    pracuje nekouří nečlen     2
 9      2    50 muž     SŠ       ne    pracuje kouří   nečlen     3
10      1    50 muž     SŠ       ne    pracuje kouří   nečlen     2
# ... with 190 more rows

BOX: Opakování

Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?

Katan2 <- Katan[order(Katan$Věk), ]

Pokud chceme data seřadit od nejstarších hráčů po ty nejmladší, použijeme parametr decreasing = TRUE.

Katan2 <- Katan[order(Katan$Věk, decreasing = TRUE), ]

Column

Příklady

Příklad 12

Seřaďte databázi Katan podle proměnné Věk (vzestupně), následně Děti (sestupně) a na závěr podle proměnné Pohlaví.

Join

Column

Port Moresby: Join

V Port Moresby nás čeká poslední příkaz této kapitoly s názvem join(). Nezřídka kdy se nám v naší práci bude stávat, že bychom potřebovali pracovat s různými kombinacemi rozdílných datových tabulek. K tomu nám pomůže právě funkce join(). Variant této funkce je však tolik, že bude lépe si je nejdříve ukázat v následujícím přehledu. Teprve až poté se podíváme na praktické úlohy.

Box: Kombinace data frame


Kombinací je doopravdy hodně. Ukažme si proto alespoň dva příklady. Řekněme, že máme dvě databáze Katan_01 a Katan_02, které mají společnou jednu proměnnou s názvem Pořadí a my chceme, aby se tyto tabulky spojily právě podle této proměnné. Abychom si příklad mohli ukázat, musíme si nejdříve tyto databáze vytvořit.

Katan_01 <- mutate(Katan, 
                   Pořadí = 1:200)
Katan_01 <- select(Katan_01, c(10, 1:5))

Katan_02 <- mutate(Katan, 
                   Pořadí = sample(1:200, size = 200, replace = FALSE))
Katan_02 <- select(Katan_02, 6:10)
[1] "Katan_01"
# A tibble: 200 x 6
   Pořadí Partie   Věk Pohlaví Vzdělání Kolej
    <int>  <dbl> <dbl> <chr>   <chr>    <chr>
 1      1      4    13 žena    ZŠ       ne   
 2      2      4    13 žena    ZŠ       ne   
 3      3      3    14 muž     ZŠ       ne   
 4      4      8    14 muž     ZŠ       ne   
 5      5      5    15 muž     ZŠ       ne   
 6      6      6    15 muž     ZŠ       ne   
 7      7      6    15 muž     ZŠ       ne   
 8      8      3    15 žena    ZŠ       ne   
 9      9      3    15 žena    ZŠ       ne   
10     10      9    15 žena    ZŠ       ne   
# ... with 190 more rows
[1] "Katan_02"
# A tibble: 200 x 5
   Pořadí Práce     Kouření Klub    Děti
    <int> <chr>     <chr>   <chr>  <dbl>
 1    157 nepracuje nekouří nečlen     0
 2     15 nepracuje nekouří nečlen     0
 3    188 nepracuje nekouří člen       0
 4    164 nepracuje nekouří nečlen     0
 5    118 nepracuje nekouří člen       0
 6    138 nepracuje nekouří člen       0
 7     38 nepracuje nekouří člen       0
 8    154 nepracuje nekouří člen       0
 9    200 nepracuje nekouří člen       0
10    137 nepracuje nekouří nečlen     0
# ... with 190 more rows

Databáze jsou vytvořené, jejich společným jmenovatelem je proměnná Pořadí. Nyní budeme chtít, aby se proměnné z databáze Katan_02 připojily k databázi Katan_01. Výsledek by měl být následně přiřazen do databáze Katan_03.

Katan_03 <- 
  left_join(Katan_01, Katan_02, by = "Pořadí")
# A tibble: 200 x 10
   Pořadí Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <int>  <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      1      4    13 žena    ZŠ       ne    pracuje   nekouří nečlen     3
 2      2      4    13 žena    ZŠ       ne    pracuje   nekouří nečlen     0
 3      3      3    14 muž     ZŠ       ne    pracuje   nekouří nečlen     2
 4      4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5      5    15 muž     ZŠ       ne    pracuje   kouří   nečlen     0
 6      6      6    15 muž     ZŠ       ne    pracuje   kouří   nečlen     0
 7      7      6    15 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 8      8      3    15 žena    ZŠ       ne    pracuje   kouří   nečlen     2
 9      9      3    15 žena    ZŠ       ne    nepracuje nekouří nečlen     1
10     10      9    15 žena    ZŠ       ne    pracuje   nekouří nečlen     0
# ... with 190 more rows

V případě, že bychom chtěli připojit proměnné z databáze Katan_01 k databázi Katan_02, použili bychom příkaz nikoliv left_join(), ale right_join().

Co když ale chceme, abychom z databáze Katan_02 použili jen dvě proměnné, dejme tomu Klub a Děti? Buďto můžeme nepotřebné proměnné z Katan_2 vymazat už předem či tak učinit až v průběhu funkce join(), jak je to ukázáno v následujícím skriptu. Stačí využít dalšího příkazu z balíčku dplyr, konkrétně příkazu select().

Katan_04 <- 
  left_join(Katan_01, select(Katan_02, 1, 4:5), by = "Pořadí")

# Nezapomeňte do příkazu select() vložit též proměnnou, podle které se
# spojení databází provede, tj. proměnná Pořadí (1).
# A tibble: 200 x 8
   Pořadí Partie   Věk Pohlaví Vzdělání Kolej Klub    Děti
    <int>  <dbl> <dbl> <chr>   <chr>    <chr> <chr>  <dbl>
 1      1      4    13 žena    ZŠ       ne    nečlen     0
 2      2      4    13 žena    ZŠ       ne    nečlen     0
 3      3      3    14 muž     ZŠ       ne    člen       0
 4      4      8    14 muž     ZŠ       ne    nečlen     0
 5      5      5    15 muž     ZŠ       ne    člen       0
 6      6      6    15 muž     ZŠ       ne    člen       0
 7      7      6    15 muž     ZŠ       ne    člen       0
 8      8      3    15 žena    ZŠ       ne    člen       0
 9      9      3    15 žena    ZŠ       ne    člen       0
10     10      9    15 žena    ZŠ       ne    nečlen     0
# ... with 190 more rows

Kromě příkazu select() by samozřejmě šlo využít i hranatých závorek jako v následujícím pokynu.

Katan_04 <- 
  left_join(Katan_01, Katan_02[, c(1, 4:5)], by = "Pořadí")
# A tibble: 200 x 8
   Pořadí Partie   Věk Pohlaví Vzdělání Kolej Klub    Děti
    <int>  <dbl> <dbl> <chr>   <chr>    <chr> <chr>  <dbl>
 1      1      4    13 žena    ZŠ       ne    nečlen     0
 2      2      4    13 žena    ZŠ       ne    nečlen     0
 3      3      3    14 muž     ZŠ       ne    člen       0
 4      4      8    14 muž     ZŠ       ne    nečlen     0
 5      5      5    15 muž     ZŠ       ne    člen       0
 6      6      6    15 muž     ZŠ       ne    člen       0
 7      7      6    15 muž     ZŠ       ne    člen       0
 8      8      3    15 žena    ZŠ       ne    člen       0
 9      9      3    15 žena    ZŠ       ne    člen       0
10     10      9    15 žena    ZŠ       ne    nečlen     0
# ... with 190 more rows

A to je z šesté kapitoly vše. pokud se vám však již v tuto chvíli stýská nejen po dplyru, ale hlavně po ggplot2, nevěšte hlavu. V následující kapitole se s nimi totiž opětovně shledáme. Přesouváme se do Asie.

Column

Příklady

Příklad 13

Představte si, že máte dvě databáze, které chcete vzájemně propojit. První tabulka například obsahuje jméno, příjmení studenta a jeho číslo v třídním výkazu. Ta druhá zahrnuje známky z chemie, fyziky a též číslo studenta (ID), které je pojítkem obou databází. Vaším cílem je spojit tyto databáze do jedné, jež bude obsahovat celkem pět sloupců (jméno, příjmení, ID, chemie a fyzika).

data_01 <- 
 data.frame(
  ID = c(23, 45, 50, 60, 70, 
           89, 40, 65, 44, 77),
  jméno = c("Jakub", "Ondřej", "Jana", 
            "Eva", "David", "Franta", 
            "Filip", "Magda", "Bára", 
            "Jakub"),
  příjmení = c("Chini", "Špetík", 
               "Nováková", "Dvořáková", 
               "Svoboda", "Novotný", 
               "Černý", "Svobodová", 
               "Procházková", "Kučera")) 

data_02 <- 
  data.frame(
    ID = c(23, 45, 50, 60, 70, 
           89, 40, 65, 44, 77),
    chemie = c(2, 1, 2, 3, 4, 
               5, 3, 1, 2, 2),
    fyzika = c(2, 1, 2, 4, 1, 
               5, 1, 1, 3, 1)) 

Příklady

Column

Column

Příklady: řešení

Příklad 1

Vytvořte databázi Katan2, která bude obsahovat pouze muže starší 26 let, kteří nemají vysokoškolské vzdělání.

Katan2 <- 
  filter(Katan, 
  Pohlaví == "muž", 
  Věk > 26,
  !(Vzdělání == "Bc - VŠ"  | Vzdělání == "VŠ"))
# A tibble: 39 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl>
 1      3    28 muž     SŠ       ne    pracuje nekouří nečlen     1
 2      2    28 muž     SŠ       ne    pracuje kouří   člen       1
 3      2    29 muž     SŠ       ne    pracuje nekouří nečlen     1
 4      2    29 muž     SŠ       ne    pracuje nekouří nečlen     1
 5      1    30 muž     SŠ       ne    pracuje nekouří nečlen     1
 6      1    31 muž     SŠ       ne    pracuje nekouří nečlen     2
 7      1    31 muž     SŠ       ne    pracuje nekouří nečlen     1
 8      1    31 muž     SŠ       ne    pracuje nekouří nečlen     1
 9      1    31 muž     SŠ       ne    pracuje kouří   nečlen     1
10      1    32 muž     SŠ       ne    pracuje nekouří nečlen     2
# ... with 29 more rows

Příklad 2

Vytvořte databázi Katan2, která bude obsahovat pouze ženy starší 26 let, které mají vysokoškolské vzdělání a zároveň mají děti.

Katan2 <- 
  filter(Katan, 
  Pohlaví == "žena", 
  Věk > 26,
  (Vzdělání == "Bc - VŠ"  | Vzdělání == "VŠ") & Děti != 0)
# A tibble: 1 x 9
  Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti
   <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl>
1      2    37 žena    VŠ       ne    pracuje kouří   nečlen     2

Příklad 3

Vytvořte databázi, která bude obsahovat pouze prvních a posledních šest pozorování z databáze Katan.

Katan2 <- 
  slice(Katan, c(1:6, 155:200))
# A tibble: 12 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      1    62 muž     ZŠ       ne    pracuje   kouří   nečlen     2
 8      1    63 muž     SŠ       ne    pracuje   kouří   nečlen     2
 9      2    68 muž     ZŠ       ne    pracuje   kouří   nečlen     4
10      1    69 muž     ZŠ       ne    pracuje   kouří   nečlen     4
11      2    74 muž     ZŠ       ne    pracuje   kouří   nečlen     2
12      1    75 muž     ZŠ       ne    pracuje   kouří   nečlen     2

Příklad 4

Vytvořte databázi, která bude na prvních dvou místech obsahovat proměnné Věk a Práce a na dalších pozicích veškeré ostatní proměnné z databáze Katan v jejich původním pořadí.

Katan2 <- select(Katan, Věk, Práce, everything())
# A tibble: 200 x 9
     Věk Práce     Partie Pohlaví Vzdělání Kolej Kouření Klub    Děti
   <dbl> <chr>      <dbl> <chr>   <chr>    <chr> <chr>   <chr>  <dbl>
 1    13 nepracuje      4 žena    ZŠ       ne    nekouří nečlen     0
 2    13 nepracuje      4 žena    ZŠ       ne    nekouří nečlen     0
 3    14 nepracuje      3 muž     ZŠ       ne    nekouří člen       0
 4    14 nepracuje      8 muž     ZŠ       ne    nekouří nečlen     0
 5    15 nepracuje      5 muž     ZŠ       ne    nekouří člen       0
 6    15 nepracuje      6 muž     ZŠ       ne    nekouří člen       0
 7    15 nepracuje      6 muž     ZŠ       ne    nekouří člen       0
 8    15 nepracuje      3 žena    ZŠ       ne    nekouří člen       0
 9    15 nepracuje      3 žena    ZŠ       ne    nekouří člen       0
10    15 nepracuje      9 žena    ZŠ       ne    nekouří nečlen     0
# ... with 190 more rows

Příklad 5

Vytvořte databázi, která bude obsahovat pouze poslední čtyři proměnné z databáze Katan.

Katan2 <- select(Katan, 6:9)
# A tibble: 200 x 4
   Práce     Kouření Klub    Děti
   <chr>     <chr>   <chr>  <dbl>
 1 nepracuje nekouří nečlen     0
 2 nepracuje nekouří nečlen     0
 3 nepracuje nekouří člen       0
 4 nepracuje nekouří nečlen     0
 5 nepracuje nekouří člen       0
 6 nepracuje nekouří člen       0
 7 nepracuje nekouří člen       0
 8 nepracuje nekouří člen       0
 9 nepracuje nekouří člen       0
10 nepracuje nekouří nečlen     0
# ... with 190 more rows

Příklad 6

Vytvořte databázi, která na prvním místě bude obsahovat proměnnou Pohlaví a dále pak všechny ostatní proměnné databáze Katan kromě proměnných Partie a Klub.

Katan2 <- select(Katan, Pohlaví, everything(), -Partie, -Klub)
# Dávejme veliký pozor na pořadí jednotlivých proměnných v příkazu select().
# Dle zadání, jako první zapisujeme proměnnou Pohlaví. Dále pak volíme
# příkaz everything (), který však do nově vytvořené databáze Katan2 přidá
# i proměnné Partie a Klub, což nechceme. Z tohoto důvodu jsou na dalších 
# místech v příkazu select zapsány tyto dvě proměnné s mínusovým znaménkem. 
# Kdybychom však zaměnili pořadí proměnných za -Partie, -Klub, everything(), 
# staly by se proměnné Partie a Klub součástí databáze Katan2.
# A tibble: 200 x 7
   Pohlaví   Věk Vzdělání Kolej Práce     Kouření  Děti
   <chr>   <dbl> <chr>    <chr> <chr>     <chr>   <dbl>
 1 žena       13 ZŠ       ne    nepracuje nekouří     0
 2 žena       13 ZŠ       ne    nepracuje nekouří     0
 3 muž        14 ZŠ       ne    nepracuje nekouří     0
 4 muž        14 ZŠ       ne    nepracuje nekouří     0
 5 muž        15 ZŠ       ne    nepracuje nekouří     0
 6 muž        15 ZŠ       ne    nepracuje nekouří     0
 7 muž        15 ZŠ       ne    nepracuje nekouří     0
 8 žena       15 ZŠ       ne    nepracuje nekouří     0
 9 žena       15 ZŠ       ne    nepracuje nekouří     0
10 žena       15 ZŠ       ne    nepracuje nekouří     0
# ... with 190 more rows

Příklad 7

V databázi Katan změňte název proměnné Práce a Děti na Job a Children.

Katan2 <-
    rename(Katan, "Job" = Práce, "Children" = Děti)
# A tibble: 200 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Job       Kouření Klub   Children
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>     <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen        0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen        0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen          0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen        0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen          0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen          0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen          0
 8      3    15 žena    ZŠ       ne    nepracuje nekouří člen          0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen          0
10      9    15 žena    ZŠ       ne    nepracuje nekouří nečlen        0
# ... with 190 more rows

Příklad 8

V databázi Katan změňte názvy všech proměnných na názvy dle vašeho uvážení bez použití příkazu rename().

names(Katan) <- 
c("Games", "Age", "Education", "Hall_of_residence", "Job", 
  "Children", "Smoke", "Club", "Gender") 
# A tibble: 200 x 9
   Games   Age Education Hall_of_residence Job   Children  Smoke   Club   Gender
   <dbl> <dbl> <chr>     <chr>             <chr> <chr>     <chr>   <chr>   <dbl>
 1     4    13 žena      ZŠ                ne    nepracuje nekouří nečlen      0
 2     4    13 žena      ZŠ                ne    nepracuje nekouří nečlen      0
 3     3    14 muž       ZŠ                ne    nepracuje nekouří člen        0
 4     8    14 muž       ZŠ                ne    nepracuje nekouří nečlen      0
 5     5    15 muž       ZŠ                ne    nepracuje nekouří člen        0
 6     6    15 muž       ZŠ                ne    nepracuje nekouří člen        0
 7     6    15 muž       ZŠ                ne    nepracuje nekouří člen        0
 8     3    15 žena      ZŠ                ne    nepracuje nekouří člen        0
 9     3    15 žena      ZŠ                ne    nepracuje nekouří člen        0
10     9    15 žena      ZŠ                ne    nepracuje nekouří nečlen      0
# ... with 190 more rows

Příklad 9

Vytvořte proměnnou Kód, která bude obsahovat 200 unikátních kódů složených pouze z písmen. Kód by měl vždy obsahovat celkově pět náhodných písmen spojených dohromady (a to kvůli anonymizaci dat vzhledem k GDPR). Následně z těchto kódových označení vytvořte pojmenované řádky v rámci databáze Katan. Poté tyto kódy převeďte do nově vzniklé proměnné Kódová_označení, která se stane součástí databáze Katan tak, aby samotné řádky získaly zpět číselné označení.

Jména <- 
  replicate(200, 
    paste(sample(LETTERS, 5, replace = TRUE), 
          collapse = ""))
Katan2 <- 
  data.frame(Katan, row.names = Jména)

Katan2 <-
    add_rownames(Katan2, "JménaHráčů")
# A tibble: 200 x 10
   JménaHráčů Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
   <chr>       <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1 LFIBC           4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2 DPYHT           4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3 IJOZT           3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4 KNPVD           8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5 WAXBF           5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6 UUHCH           6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7 FDRSI           6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8 ZHIRY           3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
 9 YTCBV           3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10 TEVNQ           9    15 žena    ZŠ       ne    nepracuje nekouří nečlen     0
# ... with 190 more rows

Příklad 10

Vytvořte v rámci databáze Katan novou proměnnou Gambler, která bude rozdělovat hráče do čtyř skupin podle proměnné Partie na příležitostný hráč (jedna až dvě partie za měsíc), častý hráč (tři až čtyři partie za měsíc), deskový gambler (pět až šest partií za měsíc) a král osadníků (více jak sedm partií za měsíc).

Katan2 <-
  mutate(Katan, 
  VěkSkupiny = 
    if_else(
      Katan$Partie >= 0 & 
      Katan$Partie < 3, "příležitostný hráč",
    if_else( 
      Katan$Partie >= 3 & 
      Katan$Partie < 5, "častý hráč",
    if_else(
      Katan$Partie >= 5 & 
      Katan$Partie < 7, "deskový gambler",
    if_else( 
      Katan$Partie >= 7, "král osadníků", "NA")))))
# A tibble: 200 x 10
   Partie   Věk Pohlaví Vzdělání Kolej Práce   Kouření Klub    Děti VěkSkupiny  
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>   <chr>   <chr>  <dbl> <chr>       
 1      4    13 žena    ZŠ       ne    neprac~ nekouří nečlen     0 častý hráč  
 2      4    13 žena    ZŠ       ne    neprac~ nekouří nečlen     0 častý hráč  
 3      3    14 muž     ZŠ       ne    neprac~ nekouří člen       0 častý hráč  
 4      8    14 muž     ZŠ       ne    neprac~ nekouří nečlen     0 král osadní~
 5      5    15 muž     ZŠ       ne    neprac~ nekouří člen       0 deskový gam~
 6      6    15 muž     ZŠ       ne    neprac~ nekouří člen       0 deskový gam~
 7      6    15 muž     ZŠ       ne    neprac~ nekouří člen       0 deskový gam~
 8      3    15 žena    ZŠ       ne    neprac~ nekouří člen       0 častý hráč  
 9      3    15 žena    ZŠ       ne    neprac~ nekouří člen       0 častý hráč  
10      9    15 žena    ZŠ       ne    neprac~ nekouří nečlen     0 král osadní~
# ... with 190 more rows

Příklad 11

Zjistěte, kolik unikátních kombinací počtu dětí a vzdělání obsahuje databáze Katan.

Kombinace <- distinct(Katan, Děti, Vzdělání)
# A tibble: 12 x 2
   Vzdělání  Děti
   <chr>    <dbl>
 1 ZŠ           0
 2 SŠ           0
 3 Bc - VŠ      0
 4 VŠ           0
 5 VŠ           1
 6 SŠ           1
 7 SŠ           2
 8 VŠ           2
 9 VŠ           4
10 SŠ           3
11 ZŠ           2
12 ZŠ           4

Příklad 12

Seřaďte databázi Katan podle proměnné Věk (vzestupně), následně Děti (sestupně) a na závěr podle proměnné Pohlaví.

Katan2 <-
    arrange(Katan, Věk, desc(Děti), Pohlaví)
# A tibble: 200 x 9
   Partie   Věk Pohlaví Vzdělání Kolej Práce     Kouření Klub    Děti
    <dbl> <dbl> <chr>   <chr>    <chr> <chr>     <chr>   <chr>  <dbl>
 1      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 2      4    13 žena    ZŠ       ne    nepracuje nekouří nečlen     0
 3      3    14 muž     ZŠ       ne    nepracuje nekouří člen       0
 4      8    14 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 5      5    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 6      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 7      6    15 muž     ZŠ       ne    nepracuje nekouří člen       0
 8      5    15 muž     ZŠ       ne    nepracuje nekouří nečlen     0
 9      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
10      3    15 žena    ZŠ       ne    nepracuje nekouří člen       0
# ... with 190 more rows

Příklad 13

Představte si, že máte dvě databáze, které chcete vzájemně propojit. První tabulka obsahuje známky z chemie, fyziky a číslo studenta ve třídním výkazu. Ta druhá zahrnuje jméno, příjmení a též číslo studenta (ID), které je pojítkem obou databází. Vaším cílem je spojit tyto databáze do jedné, jež bude obsahovat celkem pět sloupců (jméno, příjmení, ID, chemie a fyzika) v tomto pořadí.

data_01 <- 
  data.frame(
    ID = c(23, 45, 50, 60, 70, 
           89, 40, 65, 44, 77),
    chemie = c(2, 1, 2, 3, 4, 
               5, 3, 1, 2, 2),
    fyzika = c(2, 1, 2, 4, 1, 
               5, 1, 1, 3, 1)) 

data_02 <- 
 data.frame(
  ID = c(23, 45, 50, 60, 70, 
           89, 40, 65, 44, 77),
  jméno = c("Petr", "Ondřej", "Jana", 
            "Eva", "David", "Franta", 
            "Filip", "Magda", "Bára", 
            "Jakub"),
  příjmení = c("Všetečka", "Kubalík", 
               "Nováková", "Dvořáková", 
               "Svoboda", "Novotný", 
               "Černý", "Svobodová", 
               "Procházková", "Kučera")) 

Data_známky <- 
  left_join(data_02, data_01, by = "ID")
# Chceme připojit tabulku data_01 k tabulce data_02,
# proto nejdříve zapíšeme název tabulky data_02, jejíž
# proměnné mají být nejdříve.
   ID  jméno    příjmení chemie fyzika
1  23   Petr    Všetečka      2      2
2  45 Ondřej     Kubalík      1      1
3  50   Jana    Nováková      2      2
4  60    Eva   Dvořáková      3      4
5  70  David     Svoboda      4      1
6  89 Franta     Novotný      5      5
7  40  Filip       Černý      3      1
8  65  Magda   Svobodová      1      1
9  44   Bára Procházková      2      3
10 77  Jakub      Kučera      2      1

Column